//请完成goroutine和channel协同工作的案例，具体要求：
//1）开启一个writeData协程，向管道intChan中写入50个整数.
//2）开启一个readData协程，从管道intChan中读取writeData写入的数据。
//3）注意：writeData和readDate操作的是同一个管道
//4）主线程需要等待writeData和readDate协程都完成工作才能退出

package main

import "fmt"

// WRITEdata
// 名为 intChan 的 chan int 类型的参数
func writeData(intChan chan int) {
	for i := 0; i < 50; i++ {
		//	写入数据
		intChan <- i
		fmt.Println("writedata once ", i, "\n")
	}
	close(intChan) // 关闭 intChan 意味着不再有数据可以写入
}

// readData
func readData(intChan chan int, exitChan chan bool) {
	for { // 无限循环
		v, ok := <-intChan // go的特性 返回chan的值和是否开启的bool值
		if !ok {           // 如果false，即为关闭，然后退出执行循环
			break
		}
		fmt.Println("readdatdaonce ", v, "\n")
	}
	exitChan <- true
	close(exitChan)
}

func main() {
	//	 定义 intchan 和exitchan
	//	当一个 channel 同时被读写，其大小可以不严格等于其中存储的值数量
	intChan := make(chan int, 5)
	exitChan := make(chan bool, 1)

	go writeData(intChan)
	go readData(intChan, exitChan)
	// 判断chan 是否关闭
	for {
		_, bigo := <-exitChan // exitChan 中只有一个true，所以此处可以用true 或者false 二者来判断是否正确退出了exitchan（true或者零值都说明已经退出，没有数据了）
		if !bigo {
			break
		}
		fmt.Println("exit", bigo, "\n")
	}
}
